% 求解线性方程组的共轭梯度法
% @author : slandarer
A = [ 3 -1  0  1 -1;
     -1  6  0  0  2;
      0  0  2  1  0;
      1  0  1  4  1;
     -1  2  0  1  5];
b = [9; 18; 1; 2; 6];
x = zeros(size(b));

epn    = inf;       % 初始精度
tol    = 1e-6;      % 要求精度
maxItr = size(A,1); % 最大轮数

k=1;
tic;
r = b-A*x;  % 计算r_0
P = r;      % 计算P_0 
while k<=maxItr && epn>tol
    alp = dot(r,P)/dot(A*P,P);    % 求解\alpha值
    x   = x+alp.*P;               % 更新变量x值
    r   = b-A*x;                  % 计算残量
    bet = dot(A*P,r)./dot(A*P,P); % 计算\beta值
    P   = r-bet.*P;               % 计算基向量
    
    k = k+1;
    epn = norm(r);
end
toc;

disp(['共进行[',num2str(k-1),']次迭代'])
disp('共轭梯度法求解结果为:')
disp(x)
disp('线性方程组的解为:')
disp(A\b)
% 历时 0.000023 秒。
% 共进行[5]次迭代
% 共轭梯度法求解结果为:
%     4.9367
%     3.4709
%     1.1418
%    -1.2835
%     1.0557
% 
% 线性方程组的解为:
%     4.9367
%     3.4709
%     1.1418
%    -1.2835
%     1.0557








